home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
mus
/
edit
/
amisox_wav.lha
/
misc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
5KB
|
258 lines
/*
* July 5, 1991
* Copyright 1991 Lance Norskog And Sundry Contributors
* This source code is freely redistributable and may be used for
* any purpose. This copyright notice must be maintained.
* Lance Norskog And Sundry Contributors are not responsible for
* the consequences of using this software.
*/
/*
* Sound Tools miscellaneous stuff.
*/
char *sizes[] = {
"NONSENSE!",
"bytes",
"shorts",
"longs",
"32-bit floats",
"64-bit floats",
"IEEE floats"
};
char *styles[] = {
"NONSENSE!",
"unsigned",
"signed (2's complement)",
"u-law",
"a-law"
};
char readerr[] = "Premature EOF while reading sample file.";
char writerr[] = "Error writing sample file. You are probably out of disk space.";
#include "st.h"
/* Utilities */
/* Read short, little-endian: little end first. VAX/386 style. */
unsigned short
rlshort(ft)
ft_t ft;
{
unsigned char uc, uc2;
uc = getc(ft->fp);
uc2 = getc(ft->fp);
return (uc2 << 8) | uc;
}
/* Read short, bigendian: big first. 68000/SPARC style. */
unsigned short
rbshort(ft)
ft_t ft;
{
unsigned char uc, uc2;
uc2 = getc(ft->fp);
uc = getc(ft->fp);
return (uc2 << 8) | uc;
}
/* Write short, little-endian: little end first. VAX/386 style. */
unsigned short
wlshort(ft, us)
ft_t ft;
unsigned short us;
{
putc(us, ft->fp);
putc(us >> 8, ft->fp);
if (ferror(ft->fp))
fail(writerr);
}
/* Write short, big-endian: big end first. 68000/SPARC style. */
unsigned short
wbshort(ft, us)
ft_t ft;
unsigned short us;
{
putc(us >> 8, ft->fp);
putc(us, ft->fp);
if (ferror(ft->fp))
fail(writerr);
}
/* Read long, little-endian: little end first. VAX/386 style. */
unsigned long
rllong(ft)
ft_t ft;
{
unsigned char uc, uc2, uc3, uc4;
/* if (feof(ft->fp))
fail(readerr); /* No worky! */
uc = getc(ft->fp);
uc2 = getc(ft->fp);
uc3 = getc(ft->fp);
uc4 = getc(ft->fp);
return ((long)uc4 << 24) | ((long)uc3 << 16) | ((long)uc2 << 8) | (long)uc;
}
/* Read long, bigendian: big first. 68000/SPARC style. */
unsigned long
rblong(ft)
ft_t ft;
{
unsigned char uc, uc2, uc3, uc4;
/* if (feof(ft->fp))
fail(readerr); /* No worky! */
uc = getc(ft->fp);
uc2 = getc(ft->fp);
uc3 = getc(ft->fp);
uc4 = getc(ft->fp);
return ((long)uc << 24) | ((long)uc2 << 16) | ((long)uc3 << 8) | (long)uc4;
}
/* Write long, little-endian: little end first. VAX/386 style. */
unsigned long
wllong(ft, ul)
ft_t ft;
unsigned long ul;
{
int datum;
datum = (ul) & 0xff;
putc(datum, ft->fp);
datum = (ul >> 8) & 0xff;
putc(datum, ft->fp);
datum = (ul >> 16) & 0xff;
putc(datum, ft->fp);
datum = (ul >> 24) & 0xff;
putc(datum, ft->fp);
if (ferror(ft->fp))
fail(writerr);
}
/* Write long, big-endian: big end first. 68000/SPARC style. */
unsigned long
wblong(ft, ul)
ft_t ft;
unsigned long ul;
{
int datum;
datum = (ul >> 24) & 0xff;
putc(datum, ft->fp);
datum = (ul >> 16) & 0xff;
putc(datum, ft->fp);
datum = (ul >> 8) & 0xff;
putc(datum, ft->fp);
datum = (ul) & 0xff;
putc(datum, ft->fp);
if (ferror(ft->fp))
fail(writerr);
}
/* Read and write words and longs in "machine format". Swap if indicated. */
/* Read short. */
unsigned short
rshort(ft)
ft_t ft;
{
unsigned short us;
/* if (feof(ft->fp))
fail(readerr); /* No worky! */
fread(&us, 2, 1, ft->fp);
if (ft->swap)
us = swapw(us);
return us;
}
/* Write short. */
unsigned short
wshort(ft, us)
ft_t ft;
unsigned short us;
{
if (ft->swap)
us = swapw(us);
if (fwrite(&us, 2, 1, ft->fp) != 1)
fail(writerr);
}
/* Read long. */
unsigned long
rlong(ft)
ft_t ft;
{
unsigned long ul;
/* if (feof(ft->fp))
fail(readerr); /* No worky! */
fread(&ul, 4, 1, ft->fp);
if (ft->swap)
ul = swapl(ul);
return ul;
}
/* Write long. */
unsigned long
wlong(ft, ul)
ft_t ft;
unsigned long ul;
{
if (ft->swap)
ul = swapl(ul);
if (fwrite(&ul, 4, 1, ft->fp) != 1)
fail(writerr);
}
/* Byte swappers */
unsigned short
swapw(us)
unsigned short us;
{
return ((us >> 8) | (us << 8)) & 0xffff;
}
unsigned long
swapl(ul)
unsigned long ul;
{
return (ul >> 24) | ((ul >> 8) & 0xff00) | ((ul << 8) & 0xff0000) | (ul << 24);
}
/* dummy routine for do-nothing functions */
int nothing() {;}
/* dummy drain routine for effects */
null_drain(effp, obuf, osamp)
eff_t effp;
long *obuf;
long *osamp;
{
*osamp = 0;
}
/* here for linear interp. might be useful for other things */
gcd(a, b)
int a, b;
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
lcm(a, b)
int a, b;
{
int m;
return (a * b) / gcd(a, b);
}
/* sine wave gen should be here, also */